package flow

import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun main(args: Array<String>) {
    runBlocking {
//        flow {
//            (1..5).forEach { i ->
//                delay(500)
//                emit(i)
//            }
//        }.collect { i ->
//            if (i == 3) cancel()
//            println("collect: $i")
//        }

        // 不可取消的，添加 cancelable 方法，变成可取消。
        // 本质是 .onEach { currentCoroutineContext().ensureActive() } 的快捷方法。
        (1..5).asFlow().cancellable().collect {i ->
            if (i == 3) cancel()
            println("collect: $i")
        }

        // ensureActive - https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/ensure-active.html

    }
}